/*
 *修改ThreeSum，正确处理两个较大的int值相加可能溢出的情况。
 */
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
int BinarySearch(const vector<int> &nums,int target)//二分查找返回下标  
{
    decltype(nums.size()) lo=0;
    decltype(nums.size()) hi=nums.size()-1;
    while(lo<=hi){//迭代查找
        int mid=(lo+hi)/2;//取中间数
        if(nums[mid]==target)//找到
            return mid;
        if(nums[mid]>target)
            hi=mid-1;
        else
            lo=mid+1;
    }
    return 0;//没找到
}
int ThreeSum(vector<int> &nums,int target)//找到三个整数使它们的和为target
{
    
    int cnt=0;//计算和等于目标的个数
    auto length=nums.size();
    if(length<3)
        return cnt;
    sort(nums.begin(),nums.end());//先排序
    for(decltype(nums.size()) i=0;i!=length;++i)
    {
        for(auto j=i+1;j!=length;++j)//注意是无符号整数
        {
            int sum=nums[i]+nums[j];
           // cout<<sum<<endl;
            if((nums[i]>0 && nums[j]>0 && sum<0)||(nums[i]<0 && nums[j]<0 && sum>0))//判断溢出
                continue;
            if(BinarySearch(nums,target-sum)>j)//二分查找大于i防止重复  好像还是会溢出  
            {
                ++cnt;
            }         
        }
    }
    return cnt;
}


int main()
{
    vector<int> nums;
    int num;
    while(cin>>num)
        nums.push_back(num);
    cout<<ThreeSum(nums,0)<<endl;
    return 0;
}